// eslint-disable-next-line @typescript-eslint/no-var-requires
export const Minio = require("minio");

interface MinioConfig {
  endPoint: string;
  port: number;
  useSSL: boolean;
  accessKey: string;
  secretKey: string;
}

let MinioConfig: MinioConfig | null = null;

/**
 * 初始化 Minio 配置。
 * @param {object} config - Minio 的配置对象。
 * @throws {Error} 如果配置参数为空，则抛出错误。
 */
export function initMinio(config: MinioConfig): void {
  if (!config) {
    throw new Error("Minio的配置不能为空");
  }
  MinioConfig = config;
}

/**
 * 上传对象至 Minio。
 * @param bucketName 要上传至的存储桶名称。
 * @param file 要上传的文件数据，可以是 Buffer 或字符串。
 * @param fileName 存储桶中的文件名。
 * @param callback 上传完成后执行的回调函数。
 * @throws 如果 Minio 尚未初始化，则抛出错误。
 */
export function putObject(bucketName: string, file: Buffer, fileName: string, callback: (err: never, data: never) => void): void {
  if (!MinioConfig) {
    throw new Error("请先初始化Minio");
  }
  const buf = Buffer.from(file);
  const minioClient = new Minio.Client(MinioConfig);
  minioClient.putObject(bucketName, fileName, buf, callback);
}

/**
 * 用于测试目的将对象上传至 Minio。
 * @param {string} bucketName - 要上传至的存储桶名称。
 * @param {Buffer} file - 要上传的文件数据。
 * @param {string} fileName - 存储桶中的文件名。
 */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function putObjectTest(bucketName: string, file: Buffer, fileName: string): void {
  const buf = Buffer.from(file);
  const minioClient = new Minio.Client({
    endPoint: "192.168.0.77",
    port: 9002,
    useSSL: false,
    accessKey: "admin",
    secretKey: "12345678",
  });
  minioClient.putObject(bucketName, fileName, buf, function (err: never) {
    if (err) {
      console.error(err);
    } else {
      console.log("成功上传数据到 testbucket/testobject");
    }
  });
}
